/**
 * 生成一个随机分布的球体内点云
 * @param {Float32Array} array - 存储点云坐标的数组
 * @param {Object} options - 配置选项
 * @param {number} options.radius - 球体半径
 * @returns {Float32Array} 填充了随机点的数组
 */
export function inSphere(array, { radius = 1 } = {}) {
  const length = array.length;
  
  for (let i = 0; i < length; i += 3) {
    // 生成随机的球坐标
    const theta = Math.random() * Math.PI * 2; // 0-2π
    const phi = Math.acos(2 * Math.random() - 1); // 0-π
    const r = radius * Math.cbrt(Math.random()); // 立方根确保均匀分布
    
    // 转换为笛卡尔坐标
    array[i] = r * Math.sin(phi) * Math.cos(theta);
    array[i + 1] = r * Math.sin(phi) * Math.sin(theta);
    array[i + 2] = r * Math.cos(phi);
  }
  
  return array;
}

/**
 * 生成一个随机分布的球面上的点
 * @param {Float32Array} array - 存储点云坐标的数组
 * @param {Object} options - 配置选项
 * @param {number} options.radius - 球体半径
 * @returns {Float32Array} 填充了随机点的数组
 */
export function onSphere(array, { radius = 1 } = {}) {
  const length = array.length;
  
  for (let i = 0; i < length; i += 3) {
    // 生成随机的球坐标
    const theta = Math.random() * Math.PI * 2; // 0-2π
    const phi = Math.acos(2 * Math.random() - 1); // 0-π
    
    // 转换为笛卡尔坐标
    array[i] = radius * Math.sin(phi) * Math.cos(theta);
    array[i + 1] = radius * Math.sin(phi) * Math.sin(theta);
    array[i + 2] = radius * Math.cos(phi);
  }
  
  return array;
}

/**
 * 在给定轴的平面内生成随机点
 * @param {Float32Array} array - 存储点云坐标的数组
 * @param {Object} options - 配置选项
 * @param {number} options.radius - 最大半径
 * @param {string} options.axis - 平面朝向的轴 ('x', 'y', 或 'z')
 * @returns {Float32Array} 填充了随机点的数组
 */
export function inCircle(array, { radius = 1, axis = 'z' } = {}) {
  const length = array.length;
  
  for (let i = 0; i < length; i += 3) {
    // 随机角度和半径
    const theta = Math.random() * Math.PI * 2;
    const r = radius * Math.sqrt(Math.random()); // 平方根确保均匀分布
    
    // 根据轴设置点坐标
    if (axis === 'x') {
      array[i] = 0;
      array[i + 1] = r * Math.cos(theta);
      array[i + 2] = r * Math.sin(theta);
    } else if (axis === 'y') {
      array[i] = r * Math.cos(theta);
      array[i + 1] = 0;
      array[i + 2] = r * Math.sin(theta);
    } else { // axis === 'z'
      array[i] = r * Math.cos(theta);
      array[i + 1] = r * Math.sin(theta);
      array[i + 2] = 0;
    }
  }
  
  return array;
} 